﻿<?php
/*
 *  Copyright 2003-2033 dahantc.com Inc.All Rights Reserved.
 *
 *  【使用前必读说明！】
 *	此Demo为短信验证码的发送和校验示例，为精简篇幅，这里将发送和校验逻辑放在同一文件中；
 *  实际开发可以将发送和校验分开成不同的文件进行处理，使用此文件时需注意：
 *  1.本示例基于Redis缓存技术，所以必须开启Redis服务；
 *	  如果使用数据库或临时文件，需要对验证码的存取过程做相应改动
 *  2.注释说明标注【修改我！】的地方，必须使用合法有效的参数
 *  3.注释说明标注【可注释！】的地方，主要为echo输出用于debug，可以根据实际情况进行关闭
 *  
 *  如果您在接入过程中，碰到任何技术问题，请随时联系大汉云通讯的客服和技术支持寻求帮助！官网地址：http://www.dahancloud.com
 */

include_once("./DahantcSmsSDK.php");
include_once("./RedisManager.php");


////////////////////////////////查询参数处理////////////////////////////

// 访问示例：请确保访问地址有效，send_phone参数有效，verify_code参数为实际正确的验证码，否则校验结果会返回不正确的提示信息
// 发送短信请求：http://www.yoursite.com/sms/VerifyCodeSendDemo.php?request_type=send_sms&send_phone=13900001234
// 验证码校验请求：http://www.yoursite.com/sms/VerifyCodeSendDemo.php?request_type=check_verify_code&send_phone=13900001234&verify_code=123456

$request_type = $_GET['request_type'];  // 请求类型: "send_sms"->发送短信验证码；"check_verify_code"->短信验证码校验
$send_phone = $_GET['send_phone'];		// 待接收短信验证码的手机号码，一般由用户在登录或注册时输入
$verify_code = $_GET['verify_code'];	// 待验证的短信验证码，一般由用户收到后输入文本框并提交给服务端进行验证

// 【可注释！】debug ...
echo ' _GET[request_type]: ' . $request_type . '<br/>';
echo ' _GET[send_phone]: ' . $send_phone . '<br/>';
echo ' _GET[verify_code]: ' . $verify_code . '<br/>';


switch ($request_type) {
	case 'send_sms':  // 发送短信验证码
		sendVerifyCode($send_phone);
		// 【修改我！】根据客户端需要的参数进行返回
		echo '短信发送成功！结果返回为1'; 	// 返回给客户端成功的结果
		break;
	
	case 'check_verify_code': // 短信验证码校验
		if (checkVerifyCode($send_phone, $verify_code)) {
			// 【修改我！】根据客户端需要的参数进行返回
			echo '用户发送的短信验证码正确！结果返回为1';  // 返回给客户端成功的结果
		} else {
			// 【修改我！】根据客户端需要的参数进行返回
			echo '用户发送的短信验证码不对！结果返回为0';  // 返回给客户端失败的结果
		}
		break;
}

////////////////////////////////短信发送处理///////////////////////

// 简化调用过程，如果实际根据不同用户使用不同模板，可以重写此方法
function sendVerifyCode($phone) {
	$verifyCode = createVerifyCode(6);
	
	// 创建Redismanager实例
	$redisManager = new RedisManager();
	$redisManager->setValue($phone, $verifyCode); //将验证码存到redis中，做后续二次验证
	
	// 【修改我！】请使用申请通过的模板ID，替换这里的"123x"
	sendSMS($phone, "123x", [$verifyCode]); 
	
	// 【可注释！】debug ...
	echo ' sendVerifyCode Phone: ' . $phone . '<br/>';
	echo ' sendVerifyCode Verify Code: ' . $verifyCode . '<br/>';
}


// 产生验证码4-8位验证码
function createVerifyCode($len) {
	if ($len < 4) { $len = 4; }
	if ($len > 8) { $len = 8; }
	
	$vcode = '';
	for ($i = 0; $i < $len; $i++) {
		$vcode = $vcode . '' . rand(0, 9);
	}
	
	return $vcode;
}

// 根据已经发给用户手机的短信验证码，与平台的保存的验证码进行校验
function checkVerifyCode($phone, $vcode) {
	// 创建Redismanager实例
	$redisManager = new RedisManager();
	$result = $redisManager->getValue($phone); //从redis中取出对应手机号码已经发送过的验证码
	
	// 【可注释！】debug ...
	echo ' checkVerifyCode Phone: ' . $phone . '<br/>';
	echo ' checkVerifyCode Posted Verify Code: ' . $vcode . '<br/>';
	echo ' checkVerifyCode Saved Verify Code: ' . $result . '<br/>';
	
	$isRight = ($vcode == $result);
	
	//【根据实际情况，注释或打开！】校验完之后，不管正确与否，用过就删除
	//$redisManager->deleteValue($phone);	
	
	return $isRight;
}

/**
  * 发送模板短信
  * @param to 手机号码，多个手机号码需用英文逗号分开
  * @param tempId 模板ID，对应开发者后台中的模板编号
  * @param datas 替换内容，格式为数组，例如：['5678','3']，如果模板中的内容不需要替换，需填 NULL
  */
function sendSMS($to, $tempId, $datas) {
	
	/**
	  * 帐户参数配置
	  * 
	  * 用户登录之后在开发者控制台【首页】寻找以下配置参数：
	  * $accountSid: 帐号ID，对应开发者帐号下的 ACCOUNT SID
	  * $authToken: 授权令牌，对应开发者帐号下的 AUTH TOKEN
	  * $apiUrl: API调用路径，对应着开发者后台中的API URL
	  * $appId: 应用ID，对应开发者控制台【应用管理】中的某个APP ID
	  */
	// 【修改我！】请使用合法有效的参数  
	$accountSid = 'ff311c61b2fxxxxxxxx16cd9eee434a';
	$authToken 	= '66a911a1d21xxxxxxxx471f01bbda5a7';
	$apiUrl 	= 'https://sms.dahancloud.com/';
	$appId 		= '15d3cf14cb2xxxxxxxxb90d27fb7f7b0';
     
     // 初始化SDK
     $sdk = new SmsSDK();
     $sdk->setAccountSid($accountSid);
     $sdk->setAuthToken($authToken);
     $sdk->setApiUrl($apiUrl);
     $sdk->setAppId($appId);
     
     // 【可注释！】发送模板短信
     echo "Send SMS to $to <br/>";
     $result = $sdk->sendSMS($to, $tempId, $datas);
     //echo "final result: " . var_dump($result) . "<br/>";
     
     // 处理返回结果
     if($result->statusCode == '000000') {
		 //【可注释！】
         echo "Send SMS Success! <br/>";
         
         // 获取返回信息
         $data = $result->templateSMS;
		 //【可注释！】
         echo "dateCreated: " . $data->dateCreated . "<br/>";
         echo "smsMessageSid: " . $data->smsMessageSid. "<br/>";
         
         //TODO 成功处理
		 
     } else {
		 //【可注释！】
     	 echo "Send SMS Fail! <br/>";
         echo "error code: " . $result->statusCode . "<br/>";
         echo "error message: " . $result->statusMsg . "<br/>";
         
         //TODO 错误处理
         
     }

}

?>
